# -*- coding: utf-8 -*-
"""
Created on Fri Jun  8 18:43:24 2018

@author: Administrator
"""
import sys
import traceback
print('loging--loging--loging--loging')

#%%
class Log_make(object):
    #----------------------------------------------以下内容为错误信息log记录
    #主类要求：import sys
    #主类要求： if not os.path.exists(medi): os.makedirs(medi) ，f.write(）要求medi指定的文件夹必须存在，
    #主类要求：err_log_path = medi + os.sep + sys._getframe().f_code.co_name + '_err_log.txt'
    #主类要求：err_log_write(err_log_path,key,process_obj.stdout_err,item,i)
    #主类要求：其中medi应该根据情况重新定义
    #主类要求：此处共定义了2个err_log_write，不能同时使用。第一个是通用情况，第二个主要是针对subprocess模块的。
    #主类要求：每一个出错的部位都设一个i = i + 1
    @staticmethod
    def log_write(log_path,paragr):
        #作用原理：将信息写入txt文件
        #参数说明：paragr是一个双重嵌套list即：paragr[i] 代表要输出的第i行，而paragr[i][j]代表要输出的第i行的第j个元素。
        #返回值说明：无返回值
        #举例：line1 = ['','>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>']；line2 = ['Number Of dir_file： ',i]
        #举例：用上面的line1 line2来构造paragr = [line1,line2]
        #调用：traceback
        #被调用：agile_pipe
        #bug：如上所述，将来需要用for key in cmd_flag_dict.keys()和if条件语句，来解析、构造shell命令。以使脚本更加灵活。
        #bug：
        f = open(log_path ,'a')
        for i in range(0,len(paragr)):
            for j in range(0,len(paragr[i])):
                f.write(paragr[i][j])
            f.write('\n')
        traceback.print_exc(file=f)
        f.flush()
        f.close()
    @staticmethod
    def get_code_standard():
        #作用：查看当前程序运行操作系统的类型，并以此生成shell或cmd的stdout stderr解码方式（GBK,UTF-8）。
        #参数说明：
        #返回值说明：返回解码方式
        #举例：
        #调用：sys
        #被调用：err_log()
        if 'win' in sys.platform:
            code_standard = 'GBK'
        if 'linux' in sys.platform:
        #linux上的编码方式是‘utf-8’吗，有待确认
            code_standard = 'utf-8'
        return code_standard

    def python_err_log_write(self,log_path,item,i,j):
    
        #作用：用于记录程序中运行中的异常，以备查看
        #参数说明：err_log_path是指存放异常日志的完整路径（包括日志文件名）
        #参数说明：i报错的在总的循环中是第几个
        #参数说明：j报错次数的记录，用于查看日志共出现多少个错误
        #返回值说明：
        #举例：
        #调用：
        #被调用：
        line1 = ['','@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@']
        line2 = ['Number Of dir_file： ',str(i)]
        line3 = ['Number of Error: ',str(j)]
        line4 = ['Extract Failure: ',item]
        line5 = ['\n' * 1]
        paragr = [line1,line2,line3,line4,line5]
        self.log_write(log_path,paragr)

    def shell_err_log_write(self,log_path,item,stdout_err,i,j):

        #作用：用于记录调用subprocess时出现的shell异常，以备查看
        #参数说明：err_log_path是指存放异常日志的完整路径（包括日志文件名）
        #参数说明：i报错的在总的循环中是第几个
        #参数说明：j报错次数的记录，用于查看日志共出现多少个错误
        #返回值说明：
        #举例：
        #调用：模块：import traceback   自定义函数：get_code_standard()
        #被调用：agile_pipe()
        #err_log_write(err_log_path,key,stdout_err,previous_filename,present_filename)
        code_standard = self.get_code_standard()
        line1 = ['','@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@']
        line2 = ['item： ',str(i)]
        line3 = ['Number of Error: ',str(j)]
        line4 = ['key: ',item]
        line5 = ['stdout: \n', stdout_err[0].decode(code_standard)]
        line6 = ['stderr: \n', stdout_err[1].decode(code_standard)]
        line7 = ['\n' * 1]
        paragr = [line1,line2,line3,line4,line5,line6,line7]
        self.log_write(log_path,paragr)
